package co.edu.javeriana.monopoly.server.eventos;

import co.edu.javeriana.monopoly.server.modelo.EstadoJugador;
import co.edu.javeriana.monopoly.server.modelo.Evento;
import co.edu.javeriana.monopoly.server.modelo.Jugada;
import co.edu.javeriana.monopoly.server.modelo.Jugador;
import co.edu.javeriana.monopoly.server.modelo.Monopoly;
import co.edu.javeriana.monopoly.server.modelo.MonopolyException;
import co.edu.javeriana.monopoly.server.modelo.Evento;

import java.rmi.RemoteException;

import java.util.Enumeration;

public class FinTurno extends Evento {
    public FinTurno(Object[] _objects) {
        super(_objects);
    }

    public void ejecutar() throws MonopolyException {
        Monopoly m;

        try {
            m = Monopoly.getMonopoly();
        } catch (RemoteException e) {
             throw new MonopolyException("Error al traer el juego ",e);
        }

        int turno = m.getTurno();
        turno++;
        if (turno > m.getJugadores()){
            turno = 1;
        }
    
    
        Jugador janterior = (Jugador)m.getTablero().getJugadores().get(m.getPosjugadores().get(new Integer(m.getTurno())));
        janterior.setEstado(EstadoJugador.Esperando);
        
        boolean asignaturno = true;
        while(asignaturno){
            Jugador jsiguiente = (Jugador)m.getTablero().getJugadores().get(m.getPosjugadores().get(new Integer(turno)));
            if (jsiguiente.getEstado() == EstadoJugador.Esperando){
                jsiguiente.setEstado(EstadoJugador.EnTurno);
                asignaturno = false;
            }else{
                turno++;
                if (turno > m.getJugadores()){
                    turno = 1;
                }
            }
        }
        m.setTurno(turno);

        
        
        Enumeration e = m.getTablero().getJugadores().elements();
        while (e.hasMoreElements()){
            Jugador j = (Jugador)e.nextElement();
            Evento r = null;
            if ( j.getEstado() == EstadoJugador.EnTurno ){
                r = new EnTurno(null);
            }
            else{
                r =  new EnEspera(null);
            }
            try {
                Jugada jugada = new Jugada();
                jugada.setJugador(null);
                jugada.setMonopoly(m);
                jugada.setRegla(r);
                m.enviarNotificacion(jugada,j);
            } catch (RemoteException f) {
                f.printStackTrace();
                throw new MonopolyException("Error asignar turno ",f);
            }
        }

    }
}
